#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2024/12/30 18:19
# @Author : George
import socket
import selectors

serverSocket = socket.socket(socket.AF_INET)
serverSocket.bind(("127.0.0.1", 10001))
serverSocket.listen(5)
serverSocket.setblocking(False)


def accept_connection(server):
    conn, addr = server.accept()
    sel.register(conn, selectors.EVENT_READ, receive_connection)


def receive_connection(conn):
    try:
        data = conn.recv(1024)
        if not data:
            conn.close()
            sel.unregister(conn)
            return
        conn.send(data.upper())
    except:
        conn.close()
        sel.unregister(conn)
        return

 # 1.创建监管对象
sel = selectors.DefaultSelector()
# 2.将被监管对象注册到select的监管列表里面
# 监管对象，事件，回调函数(server对象可读时，调用的函数，就是有链接的时候）
sel.register(serverSocket, selectors.EVENT_READ, accept_connection)
while True:
    # epoll回调机制，会在对象可读的时候，将对象加入就绪链表，它不会自发触发回调函数
    # 3. 获取就绪链表里面的对象，并且调用对象的回调函数
    r_list = sel.select()  # 可读对象列表
    print(r_list)
    for key, mask in r_list:
        callback = key.data  # 回调函数
        callback(key.fileobj)
